#ifndef BBH_OUTBUFFER_H_
#define BBH_OUTBUFFER_H_
#ifdef __cplusplus
extern "C"
{
#endif

#include "bbh_include.h"

struct bbh_outbuffer_s {
	char            * buf;                // 消息缓冲区
    size_t          buf_len;            // 缓冲区长度
    size_t          max_len;            // 缓冲区最大长度
	size_t          data_len;           // 已写入数据长度
    size_t          pending_count;      // 未写入字节数
};
/**
 * @brief 创建实例
 * 
 * @param max_len   消息最大长度
 * @param pptr      生成的实例
 * @return int      0成功
 */
int bbh_outbuffer_create(size_t max_len, bbh_outbuffer_t**pptr);

/**
 * @brief 扩大实例尺寸，但不能超过最大尺寸
 * 
 * @param _         实例
 * @param delta     要扩大的增量
 * @return int      扩大后的尺寸。<0 失败
 */
int bbh_outbuffer_extend(bbh_outbuffer_t*_, size_t delta);

/**
 * @brief   向实例写入数据
 * 
 * @param _         实例
 * @param data      写入的数据
 * @param len       写入的数据长度
 * @return int      写入后实例数据的长度。<0 写入失败
 */
int bbh_outbuffer_write(bbh_outbuffer_t*_, const char*data, size_t len);

/**
 * @brief 格式化输出
 * 
 * @param _         实例
 * @param fmt       格式
 * @param args      格式需要的数据
 * @return int      写入后实例数据的长度。<0 格式化失败
 */
int bbh_outbuffer_vprint(bbh_outbuffer_t*_, const char*fmt, va_list args);

/**
 * @brief 格式化输出
 * 
 * @param _         实例
 * @param fmt       格式
 * @param ...       格式需要的数据
 * @return int      写入后实例数据的长度。<0 格式化失败
 */
int bbh_outbuffer_print(bbh_outbuffer_t*_, const char*fmt, ...);

int bbh_outbuffer_strftime(bbh_outbuffer_t*_, const char*fmt, time_t sec);

void bbh_outbuffer_reset(bbh_outbuffer_t*_);

void bbh_outbuffer_clear(bbh_outbuffer_t*_);

/**
 * @brief 释放实例
 * 
 * @param _         实例
 */
void bbh_outbuffer_free(bbh_outbuffer_t*_);

#ifdef __cplusplus
}
#endif
#endif